﻿#pragma once
#ifndef XL_XEXPAND_DWEBX_JWT_H
//@隐藏{
#define XL_XEXPAND_DWEBX_JWT_H

#ifdef WEBOAT_EXPORTS
#include "pch.h"
#include "module_WebOat.h"

#else

namespace jwt {
	template<typename T>
	class builder {};
    template<typename T,typename T1>
    class verifier {};
	struct default_clock{};
	namespace traits {
		struct kazuho_picojson {};
	};
};

#endif

//@隐藏}
//@分组{ JWT类

//@别名 WOJWT生成器
typedef std::shared_ptr<jwt::builder<jwt::traits::kazuho_picojson>> WoJWT;

//@备注 创建一个JWT生成器
//@参数 签发时间 单位为毫秒,0为当前时间
//@参数 过期时间 单位为毫秒,0为当前时间延后5分钟
//@参数 发行签名 用于证明其签发机构
//@别名 WOJWT创建生成器(签发时间,过期时间,发行签名)
WEBOAT_MODIFICATION WoJWT WEBOAT_API WoJWTCreate(const CXTextA& issuer = "auth",
	LONGLONG issuedAt = 0,
	LONGLONG expiresAt = 0);

//@备注 设置JWT的Issuer,用于证明其签发机构
//@别名 WOJWT置发行签名(JWT生成器,签名)
WEBOAT_MODIFICATION void WEBOAT_API WoJWTSetIssuer(WoJWT& jwtBuilder, const CXTextA& issuer);
//@备注 设置令牌的签发时间
//@参数 签发时间 单位为毫秒,0为当前时间
//@别名 WOJWT置签发时间(JWT生成器,签发时间)
WEBOAT_MODIFICATION void WEBOAT_API WoJWTSetIssuedAt(WoJWT& jwtBuilder, LONGLONG issuedAt = 0);
//@备注 设置令牌的过期时间
//@参数 过期时间 单位为毫秒,0为当前时间延后5分钟
//@别名 WOJWT置过期时间(JWT生成器,过期时间)
WEBOAT_MODIFICATION void WEBOAT_API WoJWTSetExpiresAt(WoJWT& jwtBuilder, LONGLONG expiresAt = 0);

//@别名 WOJWT置令牌类型(JWT生成器,JWT类型)
WEBOAT_MODIFICATION void WoJWTSetType(WoJWT& jwtBuilder, const CXTextA& type="JWT");

//@备注 为JWt添加负载数据
//@参数 标头 例如:"id","name"
//@参数 数据集 例如:data="huiyi",data["name"]="huiyi"
//@别名 WOJWT添加负载数据(JWT生成器,标头,数据集)
WEBOAT_MODIFICATION void WoJWTAdd(WoJWT& jwtBuilder, const char* id, WoJson& data);

//@别名 WOJWT签名加密_HS256(JWT生成器,秘钥)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignHS256(WoJWT& jwtBuilder, const CXTextA& key);
//@别名 WOJWT签名加密_HS384(JWT生成器,秘钥)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignHS384(WoJWT& jwtBuilder, const CXTextA& key);
//@别名 WOJWT签名加密_HS512(JWT生成器,秘钥)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignHS512(WoJWT& jwtBuilder, const CXTextA& key);

//@别名 WOJWT签名加密_PS256(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignPS256(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password = "",
    const CXTextA& private_key = "",
    const CXTextA& private_key_password = "");
//@别名 WOJWT签名加密_PS384(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignPS384(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password = "",
    const CXTextA& private_key = "",
    const CXTextA& private_key_password = "");
//@别名 WOJWT签名加密_PS512(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignPS512(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password = "",
    const CXTextA& private_key = "",
    const CXTextA& private_key_password = "");
//@别名 WOJWT签名加密_RS256(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignRS256(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password = "",
    const CXTextA& private_key = "",
    const CXTextA& private_key_password = "");
//@别名 WOJWT签名加密_RS384(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignRS384(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password = "",
    const CXTextA& private_key = "",
    const CXTextA& private_key_password = "");
//@别名 WOJWT签名加密_RS512(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WEBOAT_API WoJWTSignRS512(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password = "",
    const CXTextA& private_key = "",
    const CXTextA& private_key_password = "");
//@别名 WOJWT签名加密_ED25519(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WoJWTSignED25519(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password,
    const CXTextA& private_key,
    const CXTextA& private_key_password);
//@别名 WOJWT签名加密_ED448(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WoJWTSignED448(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password,
    const CXTextA& private_key,
    const CXTextA& private_key_password);
//@别名 WOJWT签名加密_ES256(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WoJWTSignES256(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password,
    const CXTextA& private_key,
    const CXTextA& private_key_password);
//@别名 WOJWT签名加密_ES256k(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WoJWTSignES256k(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password,
    const CXTextA& private_key,
    const CXTextA& private_key_password);
//@别名 WOJWT签名加密_ES384(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WoJWTSignES384(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password,
    const CXTextA& private_key,
    const CXTextA& private_key_password);
//@别名 WOJWT签名加密_ES512(JWT生成器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION CXTextA WoJWTSignES512(WoJWT& jwtBuilder,
    const CXTextA& public_key,
    const CXTextA& public_key_password,
    const CXTextA& private_key,
    const CXTextA& private_key_password);


//-----------------------------------------------


//@别名 WOJWT验证器
typedef std::shared_ptr<jwt::verifier<jwt::default_clock, jwt::traits::kazuho_picojson>> JWTVerifier;

//@别名 WOJWT验证器_创建(签发人)
WEBOAT_MODIFICATION JWTVerifier WoJWTVerify(const CXTextA& issuer="auth");
//@别名 WOJWT验证_置验证算法_HS256(JWT验证器,密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmHS256(JWTVerifier& verify, const CXTextA& key);
//@别名 WOJWT验证_置验证算法_HS384(JWT生成器,密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmHS384(JWTVerifier& verify, const CXTextA& key);
//@别名 WOJWT验证_置验证算法_HS512(JWT验证器,密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmHS512(JWTVerifier& verify, const CXTextA& key);
//@别名 WOJWT验证_置验证算法_PS256(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmPS256(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password);
//@别名 WOJWT验证_置验证算法_PS384(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmPS384(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_PS512(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmPS512(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_RS256(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmRS256(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password);
//@别名 WOJWT验证_置验证算法_RS384(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmRS384(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_RS512(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmRS512(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_ED25519(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmED25519(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_ED448(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmED448(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_ES256(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmES256(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_ES256k(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmES256k(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_ES384(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmES384(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);
//@别名 WOJWT验证_置验证算法_ES512(JWT验证器,公钥,公钥密码,私钥,私钥密码)
WEBOAT_MODIFICATION void WOJWTAllowAlgorithmES512(JWTVerifier& verify,
	const CXTextA& public_key,
	const CXTextA& public_key_password,
	const CXTextA& private_key,
	const CXTextA& private_key_password
);




//@分组}
#endif

